/**
 * Copyright (C) 2016 Eshore Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.eshore.thrpc.main;

import com.eshore.thrpc.RpcException;
import com.eshore.thrpc.common.configure.PropertiesConfiguration;
import com.eshore.thrpc.config.ClientConfig;


/**
 * Client封装类
 * <p>
 * 
 * @author : zhouzhixiang
 * @date : 2015-8-17
 */
public class Client<TServiceClient> {


    /** {@link ClientConfig} */
    private final ClientConfig<TServiceClient> clientConfig;

    /**
     * 配置文件路径说明：<br>
     * 1. 使用file，classpath和classpath*做路径开头 <br>
     * 2. classpath寻址项目中的文件 <br>
     * 3. classpath*既寻址项目，也寻址jar包中的文件 <br>
     * 4. file寻址文件系统中的文件:如：D:\\config.properties,/etc/config. properties <br>
     * 5. 默认是classpath <br>
     * 6. 例如：classpath*:log/log4j.xml;file:/home/bfd/abc.sh;classpath:log/log4j.
     * xml
     * <p>
     * 
     * @param configs
     *            配置文件列表，目前只使用第一个配置文件
     * @throws RpcException
     */
    public Client(String[] configs) throws RpcException {
        PropertiesConfiguration configuration = PropertiesConfiguration.newInstance(configs[0]);
        // 初始化client
        clientConfig = new ClientConfig<TServiceClient>();
        ConfigHelper.initConfig(clientConfig, "client.", configuration);
    }


    /**
     * 创建代理<br>
     * <b>注意:</b>代理内部已经使用连接池，所以这里只需要创建一个实例，多线程共享；特殊情况下，可以允许创建多个实例，
     * 但严禁每次调用前都创建一个实例。
     */
    public TServiceClient createProxy() throws Exception {
        return (TServiceClient) clientConfig.createProxy();
    }

    /**
     * (显式)关闭client，释放资源<br>
     * <b>注意:</b>createProxy()时，会在addShutdownHook中添加关闭事件，
     * 所以使用kill关闭程序时是不需要调用close的。 这里主要提供给需要在程序中显示释放资源的情形，这时可以显式调用close释放资源。
     * <p>
     */
    public void close() {
        clientConfig.destory();
    }

}
